package Stragos.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import Stragos.excepcion.DAOExcepcion;
import Stragos.modelo.Artista;
import Stragos.modelo.Cancion;
import Stragos.modelo.DetalleCancion;
import Stragos.modelo.DetalleProducto;
import Stragos.modelo.Pedido;
import Stragos.modelo.Producto;
import Stragos.modelo.Sala;
import Stragos.modelo.Tipoproducto;
import Stragos.negocio.GestionPedidos;
import Stragos.util.ConexionBD;
 

public class PedidoDAO extends BaseDAO {

	
	public Pedido insertar(Pedido vo) throws DAOExcepcion {
		String query = "INSERT INTO pedido(tipo,cantidad,fecha,idcliente) "
				+ "VALUES (?,?,?,?)";
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			//stmt.setInt(1, vo.getIdPedido());
			stmt.setString(1, vo.getTipo());
			stmt.setDouble(2, vo.getCantidad());
			stmt.setString(3, vo.getFecha());						
			stmt.setInt(4, vo.getCliente().getIdCliente());
			//stmt.setInt(5, vo.getComprobante().getIdComprobante());
			System.out.print(vo.getCliente().getIdCliente());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setIdPedido(id);
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	public DetalleProducto insertardetalleproduc(DetalleProducto vo) throws DAOExcepcion {
		String query = "INSERT INTO detalleproducto(idproducto,idpedido,cantidad) "
				+ "VALUES (?,?,?)";
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			stmt.setInt(1, vo.getIdProducto().getIdProducto());
			stmt.setDouble(2, vo.getIdPedido().getIdPedido());
			stmt.setInt(3, vo.getCantidad());						
						
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			stmt.executeQuery();
			
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public DetalleCancion insertardetalleCancion(DetalleCancion vo) throws DAOExcepcion {
		String query = "INSERT INTO detallecancion(idcancion,idpedido) "
				+ "VALUES (?,?)";
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			stmt.setInt(1, vo.getIdCancion().getIdCancion());
			stmt.setDouble(2, vo.getIdpPedido().getIdPedido());
						
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			stmt.executeQuery();
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	
	
	public Collection<Cancion> buscarxNombreCan(String nombre) throws DAOExcepcion {
		String query = "select * from cancion as c join artista as t" +
					   " where c.nombre like ? and c.idartista = t.idartista";
				
		Collection<Cancion> c = new ArrayList<Cancion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cancion vo = new Cancion();				
				vo.setIdCancion(rs.getInt("idcancion"));				
				vo.setNombre(rs.getString("nombre"));
				vo.setDescrip(rs.getString("descripcion"));
				Artista ar = new Artista();
				ar.setIdArtista(rs.getInt("idartista"));
				ar.setNombre(rs.getString("nombre"));				
				
				vo.setIdArtista(ar);				
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Collection<Artista> buscarxNombreArt(String nombre) throws DAOExcepcion {
	String query = "select * from artista" +
				   " where nombre like ?";
			
	Collection<Artista> c = new ArrayList<Artista>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setString(1, "%" + nombre + "%");
		rs = stmt.executeQuery();
		while (rs.next()) {
			Artista ar = new Artista();
			ar.setIdArtista(rs.getInt("idartista"));
			ar.setNombre(rs.getString("nombre"));				
			
			c.add(ar);
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return c;
}
	
	public Collection<Cancion>  buscarCancxArt(int artista) throws DAOExcepcion {
		String query = "select * from cancion" +
				   " where idartista = ?";
			
	Collection<Cancion> c = new ArrayList<Cancion>();
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setInt(1, artista);
		rs = stmt.executeQuery();
		while (rs.next()) {
			Cancion vo = new Cancion();				
			vo.setIdCancion(rs.getInt("idcancion"));				
			vo.setNombre(rs.getString("nombre"));
			vo.setDescrip(rs.getString("descripcion"));
							
			c.add(vo);
		}
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return c;
	}
	

	public Collection<Artista> listarArtTotales() throws DAOExcepcion {
		Collection<Artista> c = new ArrayList<Artista>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select *" +
						   " from artista order by nombre";
			
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Artista vo = new Artista();
				vo.setIdArtista(rs.getInt("idartista"));
				vo.setNombre(rs.getString("nombre"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Cancion obtenerCancionPorId(int idCancion) throws DAOExcepcion {
		Cancion vo = new Cancion();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select * from cancion where idcancion=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idCancion);

			rs = stmt.executeQuery();
			if (rs.next()) {	
				vo.setIdCancion(rs.getInt("idcancion"));
				vo.setNombre(rs.getString("nombre"));
								
				Artista artista = new Artista();
				artista.setIdArtista(rs.getInt("idartista"));
				artista.setNombre(rs.getString("nombre"));
				vo.setIdArtista(artista);
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	

}